package com.cian.utils;

import io.swagger.annotations.ApiModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@ApiModel("Redis的工具类")
@Component
public final class RedisUtils {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 获取list缓存的内容
     * @param key 键
     * @param start 开始
     * @param end 结束 0 到 -1代表所有值
     * @return 返回一定范围内列表的值
     */
    public List<Object> lGet(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key,start,end);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 获取列表的长度
     * @param key 列表的key值
     * @return 返回对应的列表长度
     */
    public Long lSize(String key){
        try{
            return redisTemplate.opsForList().size(key);
        } catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @return 返回是否成功
     */
    public boolean lSet(String key, Object value){
        try{
            redisTemplate.opsForList().rightPush(key, value);
            return true;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 将list放入缓存
     * @param key 键
     * @param value 值
     * @param time 时间(秒)
     * @return 返回是否成功
     */
    public boolean lSet(String key, Object value, long time) {
        try {
            redisTemplate.opsForList().rightPush(key, value);
            if (time > 0)
                redisTemplate.expire(key, time, TimeUnit.MILLISECONDS);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 清空某个键值列表
     * @param key 列表的键值
     * @return 返回正确性
     */
    public boolean lclear(String key){
        try{
            redisTemplate.opsForList().trim(key, 1, 0);
            return true;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 移除N个值为value
     * @param key 键
     * @param count 移除多少个， 为0表示全部删除
     * @param value 值
     * @return 移除的个数
     */
    public long lRemove(String key, long count, Object value) {
        try{
            Long remove = redisTemplate.opsForList().remove(key, count, value);
            if (remove == null) return 0;
            return remove;
        } catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 存放单个数据类型
     * @param key key
     * @param HashKey map的key
     * @param value value
     * @return 返回成功性
     */
    public boolean hset(String key, String HashKey, Object value){
        try{
            redisTemplate.opsForHash().put(key, HashKey, value);
            return true;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 存放hash类型
     * @param key 对应map的key
     * @param map 对应存放多个键值
     * @return 返回成功与否的信息
     */
    public boolean hmset(String key, Map<String, Object> map){
        try{
            redisTemplate.opsForHash().putAll(key, map);
            return true;
        } catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * HashGet
     * @param key 键 不能为null
     * @param item 项 不能为null
     * @return 值
     */
    public Object  hget(String key, String item){
        return redisTemplate.opsForHash().get(key, item);
    }


}
